package PaChong;

import com.alibaba.fastjson.JSONObject;

import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;

/**
 * @description: 使用Referer Meta标签控制referer，在H5 的 header加入meta
 * @author: 张德长 dechang.zhang@ucarinc.com
 * @date: 13:51:40 2018/10/31
 * @version:2.0
 */
public class StartPaChong {
    /*
    * 下面几种情况下，可以控制浏览器是否发送referer:

当网站使用refresh字段进行跳转的时候，大多数浏览器不发送referer;
从用户从一个HTTPS的网站点击链接到另一个HTTP的网站时，不发送referer;
html5中，a标签的rel = “noreferrer”, 可以让浏览器不发送referer;

使用Data URI scheme链接的，浏览器也不发送referer;

使用Content Security Policy, 也可以让浏览器不发送referer;

在html头部中使用meta标签来控制不让浏览器发送referer;

用户手输入网址或是从收藏夹、书签中访问。

    * */


    public static ExecutorService executor = Executors.newCachedThreadPool();
    public static int reTryNum = 0;

    public static void main(String[] args) {
        List<Category> categories = Category.getAllCategory();//一次请求
        while (!allRight(categories)) {
            getProduct(categories);//多次请求
            getProductImgs(categories);//多次请求
        }
        //写入文件
        FileWriter fw = null;
        try {
            fw = new FileWriter("info.js");
        } catch (IOException e) {
            e.printStackTrace();
        }
        PrintWriter out = new PrintWriter(fw);
        out.write(JSONObject.toJSON(categories).toString());
        out.println();
        try {
            fw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        out.close();
        System.out.println("爬虫完成任务");
    }

    public static boolean allRight(List<Category> categories) {
        reTryNum++;

        System.out.println("重试次数" + reTryNum + " ……");
        for (final Category category : categories) {
            if (!category.isSuccess) {
                System.out.println(JSONObject.toJSON(category).toString());
                return category.isSuccess;
            }
        }
        return true;
    }

    public static void getProductImgs(List<Category> categories) {
        List<Future<List>> futures = new ArrayList<Future<List>>();
        for (final Category category : categories) {
            for (final Product product : category.products) {
                futures.add(executor.submit(new Callable<List>() {
                    @Override
                    public List call() {
                        return ProductImg.getAllProductImg(product, category);
                    }
                }));
            }

        }
        for (Future<List> future : futures) {
            // 判断资源是不是已经准备完毕，准备完毕直接获取。
            if (!future.isDone()) {
                try {
                    future.get();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (ExecutionException e) {
                    e.printStackTrace();
                }
                //  System.out.println("资源还没有准备好");
            }
            //System.out.println(future.get());
        }

    }

    public static void getProduct(List<Category> categories) {
        List<Future<List>> futures = new ArrayList<Future<List>>();
        for (final Category category : categories) {
            futures.add(executor.submit(new Callable<List>() {
                @Override
                public List call() {
                    return Product.getAllProducts(category);
                }
            }));
        }
        for (Future<List> future : futures) {
            // 判断资源是不是已经准备完毕，准备完毕直接获取。
            try {
                future.get();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
           /* if (!future.isDone()) {
               // System.out.println("资源还没有准备好");
            }*/
            //System.out.println(future.get());
        }
    }
}
